import { app, BrowserWindow, protocol, nativeTheme } from 'electron';
import path from 'path';
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib';
import {
  WINDOW_HEIGHT,
  WINDOW_MIN_HEIGHT,
  WINDOW_WIDTH,
} from '@/common/constans/common';

// eslint-disable-next-line @typescript-eslint/no-var-requires
const remote = require('@electron/remote/main');
remote.initialize();

import localConfig from '@/main/common/initLocalConfig';
export default () => {
  let win: any;
  const init = () => {
    createWindow();
  };
  const createWindow = async () => {
    win = new BrowserWindow({
      // 窗口的初始高度（以像素为单位）。
      height: WINDOW_HEIGHT,
      // 窗口的最小高度。用户在尝试调整窗口大小时，窗口高度不会低于此值。
      minHeight: WINDOW_MIN_HEIGHT,
      // 窗口的内容尺寸（网页大小）将用作窗口的尺寸。默认情况下，窗口尺寸包括工具栏和标题栏等窗口元素的尺寸。
      useContentSize: true,
      // 窗口是否可以被用户调整大小。
      resizable: true,
      // 窗口的初始宽度（以像素为单位）
      width: WINDOW_WIDTH,
      // 是否显示窗口的标准框架（标题栏、最小化、最大化和关闭按钮等）。设置为 false 会使窗口没有标准边框。
      frame: false,
      // 窗口的标题
      title: '拉比克',
      // 创建窗口时是否显示它。默认为 true
      show: true,
      // 是否跳过在任务栏中显示应用。如果为 true，窗口将不会在任务栏中显示。
      skipTaskbar: true,
      // 窗口的背景颜色。此配置使用了一个三元操作符，根据 nativeTheme.shouldUseDarkColors 的值来决定背景颜色是深色还是浅色。
      backgroundColor: nativeTheme.shouldUseDarkColors ? '#1c1c28' : '#fff',
      webPreferences: {
        // 是否启用 Web 安全性特性。
        webSecurity: false,
        // 当应用在后台运行时，是否限制动画和计时器。
        backgroundThrottling: false,
        // 是否在 Electron 渲染进程和其页面的 JavaScript 上下文中隔离运行代码。
        contextIsolation: false,
        // 是否启用 <webview> 标签
        webviewTag: true,
        // 是否在页面中启用 Node.js 集成。
        nodeIntegration: true,
        // 在页面加载之前预加载的脚本。
        preload: path.join(__static, 'preload.js'),
        // 是否启用拼写检查。
        spellcheck: false,
      },
    });
    if (process.env.WEBPACK_DEV_SERVER_URL) {
      win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string);
    } else {
      createProtocol('app');
      // Load the index.html when not in development
      win.loadURL('app://./index.html');
    }
    remote.enable(win.webContents);
    protocol.interceptFileProtocol('image', (req, callback) => {
      const url = req.url.substr(8);
      callback(decodeURI(url));
    });
    win.on('closed', () => {
      win = undefined;
    });
    win.on('show', () => {
      win.webContents.executeJavaScript(
        `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onShow === "function" && window.rubick.hooks.onShow()`
      );
    });
    win.on('hide', () => {
      win.webContents.executeJavaScript(
        `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onHide === "function" && window.rubick.hooks.onHide()`
      );
    });
    // 判断失焦是否隐藏
    win.on('blur', async () => {
      const config = await localConfig.getConfig();
      if (config.perf.common.hideOnBlur) {
        win.hide();
      }
    });
  };

  const getWindow = () => win;
  return {
    init,
    getWindow,
  };
};
